/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package be.hogent.iii.project.gui;

import be.hogent.iii.project.common.game.objecten.Spel;
import be.hogent.iii.project.objects.Coordinaat;
import be.hogent.iii.project.objects.Entiteit;
import be.hogent.iii.project.objects.Veld;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import javax.swing.SwingUtilities;

/** De klasse die alle functionaliteit van een knop/vakje afhandelt. 
 *
 * @author Caribou
 */
public class PaneelEventHandler extends MouseAdapter {

    private Veld veld;
    private Spel spel;
    private Properties props;
    private VakjeButton geselecteerd;
    private SpelbordPaneel spelpaneel;
    private VeranderCursor veranderCursor;
    private boolean aanBeurt;
    private int playerId;

    /**Maak een eventhandler aan voor een speelveld
     * 
     * @param veld Het speelveld waarvoor de events worden afgehandeld
     */
    public PaneelEventHandler(Spel spel, Veld veld, Properties props, int playerId) {
        this.spel = spel;
        this.veld = veld;
        this.props = props;
        this.playerId = playerId;
        veranderCursor = new VeranderCursor(props, spel);
    }

    /**
     * Handel af wat er gebeurd als er op een vakje geklikt wordt. 
     * @param me de bijhorende mouseevent
     */
    @Override
    public void mousePressed(MouseEvent me) {
        if (SwingUtilities.isRightMouseButton(me)) {
            // waar willen we naartoe
            VakjeButton naar = (VakjeButton) me.getSource();
            String str = "Rechts geklikt op knop (" + naar.getXcoord() + "," + naar.getYcoord() + "). \n";
            System.out.println(str);

            //Zijn er dingen geselecteerd die iets moeten doen
            if (spelpaneel.getGeselecteerd() != null) {
                if (naar.getCursor().equals(veranderCursor.getBeweegCursor())) {
                    verplaats(spelpaneel.getGeselecteerd(), naar);
                } else if (naar.getCursor().equals(veranderCursor.getAanvalsCursor())) {
                    verplaats(spelpaneel.getGeselecteerd(), naar);
                //valAan(spel.getAanbeurt().getId(), spelpaneel.getGeselecteerd(), naar);
                }
            }

        } else if (SwingUtilities.isLeftMouseButton(me)) {
            //op welk vakje is er geklikt?
            geselecteerd = (VakjeButton) me.getSource();
            selecteerVak(geselecteerd);
        }
    }

    /**
     * Print de info af van een geselecteerd vakje. 
     * 
     * @param geselecteerd
     */
    private void selecteerVak(VakjeButton geselecteerd) {

        String str = "Er is geklikt op het vakje (" + geselecteerd.getXcoord() + "," + geselecteerd.getYcoord();
        System.out.println(str);
        str = "Het vakje is van het type " + geselecteerd.getVak().getClass().getSimpleName();
        System.out.println(str);
        //ons selectieLabel in bottomPaneel op het juiste type zetten
        geselecteerd.getBp().setSelectieLabel(geselecteerd.getVak().getClass().getName(), geselecteerd.getVak().getClass().getSimpleName(), -1);

        //print de entiteiten af die op het veld staan
        ArrayList<Entiteit> geselecteerdeEnt = veld.getEntiteiten(geselecteerd.getXcoord(), geselecteerd.getYcoord());
        for (int i = 0; i < geselecteerdeEnt.size(); i++) {
            Entiteit ent = geselecteerdeEnt.get(i);
            str = ent.getClass().getSimpleName() + " geselecteerd.";
            //als er een ventje staat, overschrijven we ons selectionLabel in bottomPaneel
            geselecteerd.getBp().setSelectieLabel(ent.getClass().getName(), ent.getClass().getSimpleName(), ent.getEigenaarId());
            System.out.println(str);
            str = "Eigendom van speler " + ent.getEigenaarId() + " ";
            System.out.println(str);
        }


        //was er een ander vakje vroeger geselecteerd?
        if (spelpaneel.getGeselecteerd() != null) {
            //deselecteer het vorige vakje
            spelpaneel.deselecteer(spelpaneel.getGeselecteerd());
        }
        //selecteer het nieuwe
        spelpaneel.selecteer(geselecteerd);
    }

    private void verplaats(VakjeButton van, VakjeButton naar) {
        if (isAanBeurt()) {
            ArrayList<Entiteit> geselecteerdeEnt = veld.getEntiteiten(van.getXcoord(), van.getYcoord());

            Coordinaat coorVan = new Coordinaat(van.getXcoord(), van.getYcoord());
            ArrayList<Coordinaat> pad = spelpaneel.getVakje(coorVan).getPad();
            if (pad != null) {
                for (int i = 0; i < pad.size(); i++) {
                    spelpaneel.getVakje(pad.get(i)).verwijderBewegingsRand();
                }
            }

            ArrayList<Coordinaat> nieuwPad = veld.actieVerplaats(geselecteerdeEnt, new Coordinaat(naar.getXcoord(), naar.getYcoord()));
            spelpaneel.getVakje(coorVan).setPad(nieuwPad);
            if (nieuwPad != null) {
                for (int i = 0; i < nieuwPad.size(); i++) {
                    spelpaneel.getVakje(nieuwPad.get(i)).zetBewegingsRand();
                }
            }
        }


    /*
    for (int i = 0; i < geselecteerdeEnt.size(); i++) {
    naar.getBp().getConsole().append("Plaats op plaats: " + naar.getXcoord() + "," + naar.getYcoord() + " \n");
    naar.getBp().getConsole().append(geselecteerdeEnt.get(i).getClass().getSimpleName() + " \n");
    naar.zetEntiteit(props, geselecteerdeEnt.get(i));
    }
    //toon veld terug op vorige veld
    spelpaneel.getGeselecteerd().maakLeeg(props);
    //zet nieuwe veld als geselecteerd
    if (spelpaneel.getGeselecteerd() != null) {
    //deselecteer het vorige vakje
    spelpaneel.deselecteer(spelpaneel.getGeselecteerd());
    }
    spelpaneel.selecteer(naar);
     */

    }

    /*private void valAan(int spelerID, VakjeButton vertrek, VakjeButton aanval) {
    Coordinaat eindpuntCoord = veld.actieValAan(spelerID, new Coordinaat(vertrek.getXcoord(), vertrek.getYcoord()),
    new Coordinaat(aanval.getXcoord(), aanval.getYcoord()));
    VakjeButton eindpunt = spelpaneel.getVakje(eindpuntCoord);
    System.out.println("Het object moeten we verplaatsen naar " + eindpuntCoord.getX() + ", " + eindpuntCoord.getY());
    // de plaats waar we vandaan komen leegmaken
    vertrek.maakLeeg(props);
    // het vakje waar we op aangevallen hebben refreshen
    aanval.maakLeeg(props);
    Coordinaat aangevallenVakjeCoord = new Coordinaat(aanval.getXcoord(), aanval.getYcoord());
    VakjeButton aangevallenVakje = spelpaneel.getVakje(aangevallenVakjeCoord);
    ArrayList<Entiteit> aangevallenEnt = veld.getEntiteiten(aangevallenVakjeCoord.getX(), aangevallenVakjeCoord.getY());
    for (int i = 0; i < aangevallenEnt.size(); i++) {
    aangevallenVakje.getBp().getConsole().append("Plaats op plaats: " + aanval.getXcoord() + "," + aanval.getYcoord() + " \n");
    aangevallenVakje.getBp().getConsole().append(aangevallenEnt.get(i).getClass().getSimpleName() + " \n");
    aangevallenVakje.zetEntiteit(props, aangevallenEnt.get(i));
    }
    //het vakje waar we naar toe gaan tekenen
    eindpunt.maakLeeg(props);
    ArrayList<Entiteit> teVerplaatsenEnt = veld.getEntiteiten(eindpuntCoord.getX(), eindpuntCoord.getY());
    for (int i = 0; i < teVerplaatsenEnt.size(); i++) {
    eindpunt.getBp().getConsole().append("Plaats op plaats: " + eindpunt.getXcoord() + "," + eindpunt.getYcoord() + " \n");
    eindpunt.getBp().getConsole().append(teVerplaatsenEnt.get(i).getClass().getSimpleName() + " \n");
    eindpunt.zetEntiteit(props, teVerplaatsenEnt.get(i));
    }
    spelpaneel.deselecteer(vertrek);
    spelpaneel.selecteer(eindpunt);
    }*/
    @Override
    public void mouseEntered(MouseEvent me) {
        VakjeButton entered = (VakjeButton) me.getSource();
        geselecteerd = spelpaneel.getGeselecteerd();
        ArrayList<Entiteit> geselecteerdeEnt = null;
        if (geselecteerd != null) {
            geselecteerdeEnt = veld.getEntiteiten(geselecteerd.getXcoord(), geselecteerd.getYcoord());
        }
        ArrayList<Entiteit> naarEnt = veld.getEntiteiten(entered.getXcoord(), entered.getYcoord());
        //lege velden kunnen geselecteerd worden

        if (geselecteerd == null || geselecteerdeEnt.size() == 0 || geselecteerdeEnt.get(0).getEigenaarId() != playerId) {
            entered.setCursor(veranderCursor.getSelecteerCursor());
        } else if (naarEnt.size() == 0 || naarEnt.get(0).getEigenaarId() == playerId) {
            entered.setCursor(veranderCursor.getBeweegCursor());
        } else if (naarEnt.get(0).getEigenaarId() != playerId) {
            entered.setCursor(veranderCursor.getAanvalsCursor());
        }

    }

    public void setSpelpaneel(SpelbordPaneel spelpaneel) {
        this.spelpaneel = spelpaneel;
    }

    public void beginBeurt(boolean aanBeurt) {
        
        this.aanBeurt = aanBeurt;
        
        System.out.println("begin beurt");


        spelpaneel.refresh();

        /*
        //wat is er in het spel?
        List<Entiteit> entiteiten = veld.getEntiteiten();
        System.out.println(entiteiten.size());

        for (int i = 0; i < entiteiten.size(); i++) {
            //System.out.println("plaats element nr " + i);
            Coordinaat coordEnt = entiteiten.get(i).getPlaats();
            VakjeButton entVakje = spelpaneel.getVakje(coordEnt);
            // het rallypoint refreshen
            entVakje.maakLeeg(props);

        }
        
        for (int i = 0; i < entiteiten.size(); i++) {
            //System.out.println("plaats element nr " + i);
            Coordinaat coordEnt = entiteiten.get(i).getPlaats();
            VakjeButton entVakje = spelpaneel.getVakje(coordEnt);
            // het rallypoint refreshen
            entVakje.zetEntiteit(props, entiteiten.get(i));

        }*/
    }

    public boolean isAanBeurt() {
        return aanBeurt;
    }
}
